En omfattande guide till Cypress, det kraftfulla end-to-end-testramverket, som tÀcker installation, skrivande av tester, felsökning, CI/CD-integration och bÀsta praxis.
Cypress: Den Ultimata Guiden för End-to-End-testning av Webbapplikationer
I dagens snabbt utvecklande webbutvecklingslandskap Àr det avgörande att sÀkerstÀlla kvaliteten och tillförlitligheten hos webbapplikationer. End-to-End (E2E)-testning spelar en avgörande roll för att verifiera att alla komponenter i en applikation fungerar sömlöst tillsammans ur anvÀndarens perspektiv. Cypress har framstÄtt som ett ledande E2E-testramverk och erbjuder en utvecklarvÀnlig upplevelse, kraftfulla funktioner och utmÀrkt prestanda. Denna omfattande guide kommer att guida dig genom allt du behöver veta för att komma igÄng med Cypress och effektivt testa dina webbapplikationer.
Vad Àr Cypress?
Cypress Àr ett nÀsta generations testverktyg för front-end, byggt för den moderna webben. Till skillnad frÄn traditionella testramverk som kör tester i en webblÀsare, fungerar Cypress direkt i webblÀsaren, vilket ger dig oövertrÀffad kontroll och insyn i din applikations beteende. Den Àr utformad för att vara snabb, pÄlitlig och enkel att anvÀnda, vilket gör den till ett populÀrt val bland utvecklare och QA-ingenjörer vÀrlden över. Cypress Àr skrivet i JavaScript och körs i webblÀsaren, vilket gör den mycket prestandamÀssig och erbjuder oövertrÀffad tillgÄng till applikationens interna delar.
Viktiga fördelar med att anvÀnda Cypress
- UtvecklarvÀnlig: Cypress tillhandahÄller ett rent och intuitivt API, vilket gör det enkelt att skriva och felsöka tester.
- Tidsresor: Cypress tar ögonblicksbilder av din applikations tillstÄnd under varje testkommando, vilket gör att du kan gÄ tillbaka i tiden och se exakt vad som hÀnde vid nÄgon tidpunkt.
- RealtidsinlÀsningar: Cypress laddar automatiskt om nÀr du gör Àndringar i dina tester, vilket ger omedelbar feedback.
- Automatisk vÀntan: Cypress vÀntar automatiskt pÄ att element ska bli synliga eller interaktiva innan ÄtgÀrder utförs, vilket eliminerar behovet av explicita vÀntningar.
- NÀtverkskontroll: Cypress lÄter dig stubba nÀtverksförfrÄgningar och svar, vilket gör att du kan simulera olika scenarier och testa din applikations felhantering.
- Felsökningsbarhet: Cypress tillhandahÄller utmÀrkta felsökningsverktyg, inklusive en kraftfull felsökare och detaljerade felmeddelanden.
- Testning över flera webblÀsare: Cypress stöder flera webblÀsare, inklusive Chrome, Firefox, Edge och Electron.
- Huvudlös testning: Kör tester i huvudlöst lÀge för snabbare exekvering i CI/CD-miljöer.
- Inbyggda försÀkringar: Cypress tillhandahÄller en rik uppsÀttning inbyggda försÀkringar för att verifiera det förvÀntade beteendet hos din applikation.
Installation och instÀllning
Att komma igÄng med Cypress Àr enkelt. SÄ hÀr installerar du det:
- FörutsÀttningar: Se till att du har Node.js och npm (Node Package Manager) installerat pÄ ditt system. Du kan ladda ner dem frÄn den officiella Node.js-webbplatsen.
- Installera Cypress: Ăppna din terminal eller kommandotolk, navigera till din projektkatalog och kör följande kommando:
- Ăppna Cypress: NĂ€r installationen Ă€r klar kan du öppna Cypress Test Runner genom att köra:
npm install cypress --save-dev
npx cypress open
Detta kommando kommer att starta Cypress Test Runner, som tillhandahÄller ett grafiskt grÀnssnitt för att köra och felsöka dina tester.
Skriva ditt första Cypress-test
LÄt oss skapa ett enkelt test för att verifiera att en webbplats startsida laddas korrekt. Skapa en ny fil med namnet `example.cy.js` i katalogen `cypress/e2e` i ditt projekt.
// cypress/e2e/example.cy.js
describe('Mitt första test', () => {
it('Besöker Kitchen Sink', () => {
cy.visit('https://example.cypress.io')
cy.contains('type').click()
cy.url().should('include', '/commands/actions')
cy.get('.action-email')
.type('fake@email.com')
.should('have.value', 'fake@email.com')
})
})
LÄt oss bryta ner detta test:
- `describe()`: Definerar en testsvit, som Àr en samling relaterade tester.
- `it()`: Definerar ett enskilt testfall inom testsviten.
- `cy.visit()`: Navigerar till den angivna URL:en.
- `cy.contains()`: Hittar ett element som innehÄller den angivna texten.
- `.click()`: Klickar pÄ det valda elementet.
- `cy.url()`: HÀmtar den aktuella URL:en för sidan.
- `.should()`: Gör ett pÄstÄende om applikationens tillstÄnd.
- `cy.get()`: VÀljer ett element med hjÀlp av en CSS-vÀljare.
- `.type()`: Skriver text i det valda elementet.
- `.should('have.value', 'fake@email.com')`: PÄstÄr att elementets vÀrde Àr lika med 'fake@email.com'.
Kör det hÀr testet i Cypress Test Runner för att se det i aktion. Du bör se webblÀsaren navigera till Cypress Kitchen Sink-webbplatsen, klicka pÄ lÀnken "type" och verifiera URL:en.
Cypress-kommandon
Cypress tillhandahÄller ett brett utbud av kommandon för att interagera med din applikation. HÀr Àr nÄgra av de vanligaste kommandona:
- `cy.visit(url)`: Navigerar till den angivna URL:en.
- `cy.get(selector)`: VÀljer ett element med hjÀlp av en CSS-vÀljare.
- `cy.contains(content)`: VÀljer ett element som innehÄller den angivna texten.
- `cy.click()`: Klickar pÄ det valda elementet.
- `cy.type(text)`: Skriver text i det valda elementet.
- `cy.clear()`: Rensa innehÄllet i ett inmatnings- eller textomrÄdelement.
- `cy.submit()`: Skickar ett formulÀr.
- `cy.check()`: Markera en kryssruta eller alternativknapp.
- `cy.uncheck()`: Avmarkera en kryssruta.
- `cy.select(value)`: VÀljer ett alternativ frÄn en rullgardinsmeny.
- `cy.scrollTo(position)`: Rullar sidan till den angivna positionen.
- `cy.trigger(event)`: Utlöser en DOM-hÀndelse pÄ det valda elementet.
- `cy.request(url, options)`: Gör en HTTP-begÀran till den angivna URL:en.
- `cy.intercept(route, handler)`: Avlyssnar HTTP-förfrÄgningar som matchar den angivna rutten.
- `cy.wait(time)`: VĂ€ntar den angivna tiden.
- `cy.reload()`: Laddar om den aktuella sidan.
- `cy.go(direction)`: Navigerar till föregÄende eller nÀsta sida i webblÀsarens historik.
- `cy.url()`: HÀmtar den aktuella URL:en för sidan.
- `cy.title()`: HÀmtar titeln pÄ sidan.
- `cy.window()`: HÀmtar fönsterobjektet.
- `cy.document()`: HĂ€mtar dokumentobjektet.
- `cy.viewport(width, height)`: StÀller in viewport-storleken.
Det hÀr Àr bara nÄgra av de mÄnga kommandon som finns i Cypress. Se Cypress-dokumentationen för en fullstÀndig lista över kommandon och deras alternativ.
FörsÀkringar i Cypress
FörsÀkringar anvÀnds för att verifiera det förvÀntade beteendet hos din applikation. Cypress tillhandahÄller en rik uppsÀttning inbyggda försÀkringar som du kan anvÀnda för att kontrollera tillstÄndet för element, URL:en, titeln och mer. FörsÀkringar kedjas efter Cypress-kommandon med metoden `.should()`.
HÀr Àr nÄgra vanliga försÀkringsexempel:
- `.should('be.visible')`: PÄstÄr att ett element Àr synligt.
- `.should('not.be.visible')`: PÄstÄr att ett element inte Àr synligt.
- `.should('be.enabled')`: PÄstÄr att ett element Àr aktiverat.
- `.should('be.disabled')`: PÄstÄr att ett element Àr inaktiverat.
- `.should('have.text', 'expected text')`: PÄstÄr att ett element har den angivna texten.
- `.should('contain', 'expected text')`: PÄstÄr att ett element innehÄller den angivna texten.
- `.should('have.value', 'expected value')`: PÄstÄr att ett element har det angivna vÀrdet.
- `.should('have.class', 'expected class')`: PÄstÄr att ett element har den angivna klassen.
- `.should('have.attr', 'attribute name', 'expected value')`: PÄstÄr att ett element har det angivna attributet och vÀrdet.
- `.should('have.css', 'css property', 'expected value')`: PÄstÄr att ett element har den angivna CSS-egenskapen och vÀrdet.
- `.should('have.length', expected length)`: PÄstÄr att ett element har den angivna lÀngden (t.ex. antalet element i en lista).
Du kan ocksÄ skapa anpassade försÀkringar för att passa dina specifika behov.
BÀsta praxis för att skriva Cypress-tester
Att följa bÀsta praxis kan hjÀlpa dig att skriva mer underhÄllbara, tillförlitliga och effektiva Cypress-tester. HÀr Àr nÄgra rekommendationer:
- Skriv tydliga och koncisa tester: Varje test bör fokusera pÄ en specifik funktionalitet eller scenario. Undvik att skriva alltför komplexa tester som Àr svÄra att förstÄ och underhÄlla.
- AnvÀnd meningsfulla testnamn: Ge dina tester beskrivande namn som tydligt anger vad de testar.
- Undvik hÄrdkodningsvÀrden: AnvÀnd variabler eller konfigurationsfiler för att lagra vÀrden som kan Àndras över tiden.
- AnvÀnd anpassade kommandon: Skapa anpassade kommandon för att inkapsla ÄteranvÀndningsbar logik och göra dina tester mer lÀsbara.
- Isolera tester: Varje test bör vara oberoende av andra tester. Undvik att förlita dig pÄ applikationens tillstÄnd frÄn tidigare tester.
- Rensa efter tester: à terstÀll applikationens tillstÄnd efter varje test för att sÀkerstÀlla att efterföljande tester börjar frÄn ett rent utgÄngslÀge.
- AnvÀnd dataattribut: AnvÀnd dataattribut (t.ex. `data-testid`) för att vÀlja element i dina tester. Dataattribut Àr mindre benÀgna att Àndras Àn CSS-klasser eller ID:n, vilket gör dina tester mer motstÄndskraftiga mot Àndringar i anvÀndargrÀnssnittet.
- Undvik explicita vÀntningar: Cypress vÀntar automatiskt pÄ att element ska bli synliga eller interaktiva. Undvik att anvÀnda explicita vÀntningar (t.ex. `cy.wait()`) om det inte Àr absolut nödvÀndigt.
- Testa anvÀndarflöden: Fokusera pÄ att testa anvÀndarflöden snarare Àn enskilda komponenter. Detta hjÀlper dig att sÀkerstÀlla att din applikation fungerar korrekt ur anvÀndarens perspektiv.
- Kör tester regelbundet: Integrera Cypress-tester i din CI/CD-pipeline och kör dem regelbundet för att fÄnga buggar tidigt i utvecklingsprocessen.
Avancerade Cypress-tekniker
Stubbing och Mocking
Cypress lÄter dig stubba nÀtverksförfrÄgningar och svar, vilket gör att du kan simulera olika scenarier och testa din applikations felhantering. Detta Àr sÀrskilt anvÀndbart för att testa funktioner som Àr beroende av externa API:er eller tjÀnster.
För att stubba en nÀtverksbegÀran kan du anvÀnda kommandot `cy.intercept()`. Till exempel stubbar koden nedan en GET-begÀran till `/api/users` och returnerar ett hÄnfullt svar:
cy.intercept('GET', '/api/users', {
statusCode: 200,
body: [
{ id: 1, name: 'John Doe' },
{ id: 2, name: 'Jane Doe' }
]
}).as('getUsers')
Du kan sedan vÀnta pÄ den avlyssnade begÀran med `cy.wait('@getUsers')` och verifiera att din applikation hanterar det hÄnfulla svaret korrekt.
Arbeta med lokal lagring och cookies
Cypress tillhandahÄller kommandon för att interagera med lokal lagring och cookies. Du kan anvÀnda dessa kommandon för att stÀlla in, hÀmta och rensa lokal lagring och cookies i dina tester.
För att stÀlla in ett lokalt lagringsobjekt kan du anvÀnda kommandot `cy.window()` för att komma Ät fönsterobjektet och sedan anvÀnda metoden `localStorage.setItem()`. Till exempel:
cy.window().then((win) => {
win.localStorage.setItem('myKey', 'myValue')
})
För att hÀmta ett lokalt lagringsobjekt kan du anvÀnda kommandot `cy.window()` och sedan anvÀnda metoden `localStorage.getItem()`. Till exempel:
cy.window().then((win) => {
const value = win.localStorage.getItem('myKey')
expect(value).to.equal('myValue')
})
För att stÀlla in en cookie kan du anvÀnda kommandot `cy.setCookie()`. Till exempel:
cy.setCookie('myCookie', 'myCookieValue')
För att hÀmta en cookie kan du anvÀnda kommandot `cy.getCookie()`. Till exempel:
cy.getCookie('myCookie').should('have.property', 'value', 'myCookieValue')
Hantering av filuppladdningar
Cypress tillhandahÄller ett plugin som heter `cypress-file-upload` som förenklar filuppladdningar i dina tester. För att installera pluginet, kör följande kommando:
npm install -D cypress-file-upload
LÀgg sedan till följande rad i din fil `cypress/support/commands.js`:
import 'cypress-file-upload';
Du kan sedan anvÀnda kommandot `cy.uploadFile()` för att ladda upp en fil. Till exempel:
cy.get('input[type="file"]').attachFile('example.txt')
Arbeta med IFrames
Att testa IFrames kan vara knepigt, men Cypress tillhandahÄller ett sÀtt att interagera med dem. Du kan anvÀnda kommandot `cy.frameLoaded()` för att vÀnta pÄ att en IFrame ska laddas, och sedan anvÀnda kommandot `cy.iframe()` för att hÀmta IFrames dokumentobjekt.
cy.frameLoaded('#myIframe')
cy.iframe('#myIframe').find('button').click()
Cypress och Continuous Integration/Continuous Deployment (CI/CD)
Att integrera Cypress i din CI/CD-pipeline Àr viktigt för att sÀkerstÀlla kvaliteten pÄ din applikation. Du kan köra Cypress-tester i huvudlöst lÀge i din CI/CD-miljö. SÄ hÀr:
- Installera Cypress: Se till att Cypress Àr installerat som ett beroende i ditt projekt.
- Konfigurera CI/CD: Konfigurera din CI/CD-pipeline för att köra Cypress-tester efter varje build.
- Kör Cypress huvudlöst: AnvÀnd kommandot `cypress run` för att köra Cypress-tester i huvudlöst lÀge.
Exempel pÄ CI/CD-konfiguration (med GitHub Actions):
name: Cypress Tests
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
cypress-run:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 16
- name: Install dependencies
run: npm install
- name: Cypress run
uses: cypress-io/github-action@v5
with:
start: npm start
wait-on: 'http://localhost:3000'
Denna konfiguration kommer att köra Cypress-tester nÀr kod pushas till `main`-grenen eller en pull-begÀran skapas mot `main`-grenen. à tgÀrden `cypress-io/github-action` förenklar processen att köra Cypress-tester i GitHub Actions.
Felsöka Cypress-tester
Cypress tillhandahÄller utmÀrkta felsökningsverktyg som hjÀlper dig att identifiera och ÄtgÀrda problem i dina tester. HÀr Àr nÄgra tips för att felsöka Cypress-tester:
- AnvÀnd Cypress Test Runner: Cypress Test Runner tillhandahÄller ett visuellt grÀnssnitt för att köra och felsöka dina tester. Du kan gÄ igenom dina tester ett kommando i taget, inspektera applikationens tillstÄnd och visa detaljerade felmeddelanden.
- AnvÀnd kommandot `cy.pause()`: Kommandot `cy.pause()` pausar utförandet av ditt test och lÄter dig inspektera applikationens tillstÄnd i webblÀsarens utvecklarverktyg.
- AnvÀnd kommandot `cy.debug()`: Kommandot `cy.debug()` skriver ut det valda elementet till konsolen, vilket gör att du kan inspektera dess egenskaper och attribut.
- AnvÀnd webblÀsarens utvecklarverktyg: WebblÀsarens utvecklarverktyg ger en mÀngd information om din applikation, inklusive DOM, nÀtverksbegÀranden och konsolloggar.
- LÀs felmeddelanden noggrant: Cypress tillhandahÄller detaljerade felmeddelanden som kan hjÀlpa dig att identifiera orsaken till felet. Var uppmÀrksam pÄ felmeddelandet och stackspÄret.
Cypress vs. andra testramverk
Ăven om Cypress Ă€r ett kraftfullt end-to-end-testramverk Ă€r det viktigt att förstĂ„ hur det jĂ€mförs med andra populĂ€ra alternativ. HĂ€r Ă€r en kort översikt:
- Selenium: Selenium Ă€r ett allmĂ€nt anvĂ€nt automatiseringsramverk. Ăven om det Ă€r flexibelt och stöder flera sprĂ„k, kan det vara komplext att konfigurera och underhĂ„lla. Cypress erbjuder en enklare och mer utvecklarvĂ€nlig upplevelse, sĂ€rskilt för JavaScript-baserade applikationer.
- Puppeteer: Puppeteer Àr ett Node-bibliotek som tillhandahÄller ett API pÄ hög nivÄ för att kontrollera huvudlöst Chrome eller Chromium. Det Àr utmÀrkt för att skrapa och automatisera webblÀsaruppgifter, men kan krÀva mer manuell konfiguration jÀmfört med Cypress för end-to-end-testning.
- Playwright: Playwright Àr ett annat automatiseringsramverk för flera webblÀsare som utvecklats av Microsoft. Det delar likheter med Puppeteer men erbjuder bredare webblÀsarstöd. Cypress har en unik tidsresande felsökare och en mer integrerad testupplevelse.
Valet av ramverk beror pÄ ditt projekts specifika behov och krav. Cypress Àr ett utmÀrkt val för moderna webbapplikationer som krÀver snabb, pÄlitlig och utvecklarvÀnlig end-to-end-testning.
Exempel frÄn den verkliga vÀrlden av Cypress i aktion
LÄt oss utforska nÄgra exempel frÄn den verkliga vÀrlden pÄ hur Cypress kan anvÀndas för att testa olika typer av webbapplikationer:
Testa en e-handelsapplikation
Du kan anvÀnda Cypress för att testa olika anvÀndarflöden i en e-handelsapplikation, till exempel:
- Söka efter produkter
- LĂ€gga till produkter i kundvagnen
- Kassa och bestÀllning
- Hantera kontoinstÀllningar
HÀr Àr ett exempel pÄ ett Cypress-test som verifierar att en anvÀndare framgÄngsrikt kan lÀgga till en produkt i sin kundvagn:
it('LĂ€gger till en produkt i kundvagnen', () => {
cy.visit('/products')
cy.get('.product-card').first().find('button').click()
cy.get('.cart-count').should('have.text', '1')
})
Testa en social media-applikation
Du kan anvÀnda Cypress för att testa anvÀndarinteraktioner i en social media-applikation, till exempel:
- Skapa ett nytt inlÀgg
- Gilla ett inlÀgg
- Kommentera ett inlÀgg
- Följa andra anvÀndare
HÀr Àr ett exempel pÄ ett Cypress-test som verifierar att en anvÀndare framgÄngsrikt kan skapa ett nytt inlÀgg:
it('Skapar ett nytt inlÀgg', () => {
cy.visit('/profile')
cy.get('#new-post-textarea').type('Hej vÀrlden!')
cy.get('#submit-post-button').click()
cy.get('.post').first().should('contain', 'Hej vÀrlden!')
})
Testa en bankapplikation
För bankapplikationer kan Cypress anvÀndas för att testa kritiska funktioner som:
- Logga in sÀkert
- Kontrollera kontosaldon
- Ăverföra pengar
- Hantera förmÄnstagare
Ett test för att verifiera en fondöverföring kan se ut sÄ hÀr (med lÀmplig stubbning för sÀkerhet):
it('Ăverför pengar framgĂ„ngsrikt', () => {
cy.visit('/transfer')
cy.get('#recipient-account').type('1234567890')
cy.get('#amount').type('100')
cy.intercept('POST', '/api/transfer', { statusCode: 200, body: { success: true } }).as('transfer')
cy.get('#transfer-button').click()
cy.wait('@transfer')
cy.get('.success-message').should('be.visible')
})
Slutsats
Cypress Àr ett kraftfullt och mÄngsidigt end-to-end-testramverk som kan hjÀlpa dig att sÀkerstÀlla kvaliteten och tillförlitligheten hos dina webbapplikationer. Dess utvecklarvÀnliga API, kraftfulla funktioner och utmÀrkta prestanda gör det till ett populÀrt val bland utvecklare och QA-ingenjörer vÀrlden över. Genom att följa bÀsta praxis som beskrivs i den hÀr guiden kan du skriva effektiva Cypress-tester som hjÀlper dig att fÄnga buggar tidigt i utvecklingsprocessen och leverera högkvalitativ programvara till dina anvÀndare.
I takt med att webbapplikationer fortsÀtter att utvecklas kommer vikten av end-to-end-testning bara att öka. Att omfamna Cypress och integrera det i ditt utvecklingsarbetsflöde kommer att ge dig möjlighet att bygga mer robusta, tillförlitliga och anvÀndarvÀnliga webbupplevelser.